package cn.lg.soar.database.datascope;

import com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.Parenthesis;
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;

import java.util.Objects;

/**
 * @author luguoxiang 469599794@qq.com
 * @Date: 2023/10/26 15:46
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
public class SoarDataPermissionHandler implements DataPermissionHandler {

    /**
     * @param where 原SQL Where 条件表达式
     * @param mappedStatementId Mapper接口方法ID（cn.lg.soar.system.auth.mapper.DataScopeMapper.getById）
     * @return
     */
    @Override
    public Expression getSqlSegment(Expression where, String mappedStatementId) {
        // 是否忽略
        if (DataScopeHolder.isIgnore()) {
            return where;
        }
        // 查询资源是否配置数据权限
        long resourceId = DataScopeHolder.getResourceId(mappedStatementId);
        if (Objects.equals(resourceId, -1L)) {
            return where;
        }
        // 查询数据规则
        Expression expression = DataScopeUtils.getExpression(resourceId);
        if (expression == null) {
            // 全部数据权限
            return where;
        }
        // 拼接筛选条件
        if (expression instanceof Parenthesis) {
            return new AndExpression(expression, where);
        }
        return new AndExpression(new Parenthesis(expression), where);
    }


}
